(function($) {
    function preLoadPic(pics, options) {
        this.pics = pics;
        this.options = $.extend({}, preLoadPic.DEFAULT_OPTIONS, options);

        if (this[options.mode] instanceof Function) {
            this[options.mode]();
        }
    }
    preLoadPic.DEFAULT_OPTIONS = {
        mode: 'unorderedLoad',
        each: null, //一个完成时的回调方法
        all: null //所有完成时的回调方法
    };
    preLoadPic.prototype.unorderedLoad = function() {
        var self = this,
            count = 0;
        $.each(this.pics, function(i, e) {
            // this:这里的this是携带了e的值，但是不等于e
            var imgObj = new Image();

            $(imgObj).on('load error', function() {
                count++;
                // instanceof 判断的是构造函数，所以这里的Function要大写
                self.options.each instanceof Function && self.options.each(count, self.pics.length);
                if (count === self.pics.length) {
                    self.options.all instanceof Function && self.options.all();
                }
            });

            imgObj.src = e;
        });
    };
    preLoadPic.prototype.orderedLoad = function() {
        var self = this,
            pics = this.pics,
            loadTimes = 1, //尝试加载的次数
            count = 0;

            // 定义一个局部函数，方便反复使用
        function loadPic() {
            var imgObj = new Image();

            $(imgObj).on('error load', function(event) {
                if (event.type == 'load') {
                    count++;
                } else {
                    if (++loadTimes > 3) {
                        count++;
                        loadTimes = 1;
                        console.log("load error");
                    }
                }
                self.options.each instanceof Function && self.options.each(count, pics.length);

                if (count === pics.length) {
                    self.options.all instanceof Function && self.options.all();
                } else {
                    loadPic();
                }
            });

            imgObj.src = self.pics[count];
        }

        loadPic();
    };

    // 在jquery中有两种扩展函数的方法：
    // 1、扩展工具类：直接在$上添加方法
    $.extend({
        preLoadPic: function(pics, options) {
            new preLoadPic(pics, options);
        }
    });
    // 2、扩展jquery实例上的方法：$.fn.extend
})(jQuery);//传入一个jQuery
